package com.ljy.my_study.leetcode.二进制手表;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TetMain {

//    二进制手表顶部有 4 个 LED 代表 小时（0-11），底部的 6 个 LED 代表 分钟（0-59）。每个 LED 代表一个 0 或 1，最低位在右侧。
//
//    例如，下面的二进制手表读取 "3:25" 。
//
//
//            （图源：WikiMedia - Binary clock samui moon.jpg ，许可协议：Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) ）
//
//    给你一个整数 turnedOn ，表示当前亮着的 LED 的数量，返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
//
//    小时不会以零开头：
//
//    例如，"01:00" 是无效的时间，正确的写法应该是 "1:00" 。
//    分钟必须由两位数组成，可能会以零开头：
//
//    例如，"10:2" 是无效的时间，正确的写法应该是 "10:02" 。
//             
//
//    示例 1：
//
//    输入：turnedOn = 1
//    输出：["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
//    示例 2：
//
//    输入：turnedOn = 9
//    输出：[]
//             
//
//    提示：
//
//            0 <= turnedOn <= 10
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/binary-watch
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {
        System.out.println(Integer.bitCount(1));
        System.out.println(Integer.bitCount(2));
        System.out.println(Integer.bitCount(3));
    }

    public List<String> readBinaryWatch(int turnedOn) {
        Map<Integer,List<Integer>> map=new HashMap<>();
        for(int i=0;i<=59;i++){
            int key=Integer.bitCount(i);
            List<Integer> list= map.getOrDefault(key,new ArrayList<>());
            list.add(i);
            map.put(key,list);
        }
        List<String> result=new ArrayList<>();
        for(int i=0;i<=turnedOn&&i<=4;i++){
            List<Integer> hours=map.get(i);
            if(hours==null){
                continue;
            }
            List<Integer> mins=map.get(turnedOn-i);
            if(mins==null){
                continue;
            }
            for(Integer h:hours){
                if(h>11){
                    break;
                }
                for(Integer m:mins){
                    result.add(h+":"+getValue(m));
                }
            }
        }
        return result;
    }

    private String getValue(Integer num){
        if(num<10){
            return "0"+num;
        }
        return num+"";
    }
}
